// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the “License”);
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// <https://apache.org/licenses/LICENSE-2.0>.
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an “AS IS” BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// This file was generated by scripts/generate-benchmark.py, do not modify!

const dataBig = [{
  a: '-0xA7313BE9FF6EF4B8A515FDB0989FACBD4F3AF3C2290EFAD3EE8F911C066660E7F1489',
  b: '0xAA5D62C1B6AC10831B288389DBF7CB036EB624C783F5652BAA575CDE9F76CA2',
  r: '0x2000001060800020B20000142B0C1002C9620050011602AA251189E1806822',
}, {
  a: '0xDE070CF4E5743C8DA59A2DED95BE9EB949F6BD45698DF85B653EB70F131EFFA',
  b: '-0xFB31B712655594B5A717230C5C07B54C259E93FC4D1589E2730286C118B50789',
  r: '0x4C040CD0A024348584880D2815848A3900168001288560584516930E100E872',
}, {
  a: '0xE8D734CEB922C0F1E2C4BFC127E3920BD443D9D9A9F6',
  b: '0xDC51FF35E72AF4FC55EB7DB5C5BCF62352B167F0B924C2FE801D92A62463FE34FF7',
  r: '0x485304423122007102800C012001900A404219C109F6',
}, {
  a: '-0xE3CF1E4A8B695B5FAF5D604EC404EB391D3582',
  b: '0xA60C6FD2EE9B1E8685DD63D79EE4920570FF3',
  r: '0x820C0B52480A0A04000963139EA0000420A72',
}, {
  a: '-0x61F160A0814019B5ABA8027FF7C873287847DD48101DC1EAF',
  b: '-0x58D00AF68DA7EC953DF2DE0B0535471ABFDAB13530DAD69B700',
  r: '-0x58F1FBF6ADA7EC9DBDFBFE0B7FF7CF7BBFFAF7FD78DADFDBF00',
}, {
  a: '-0x287FCEDB7F902FA3F6764034E986DBF3E714FEEC73E33E3',
  b: '-0x68E9767474DE520FCB15AD0A1F19DC423FF58828E959E8B655F40FAF',
  r: '-0x68E9767476DFFEEFFFFDAFFA3F7FFC437FFDEDBFFF79EFFED7FE3FEF',
}, {
  a: '0xC3709D580185733964F2A2943A1EB16AB85375A6AAD469A',
  b: '0xE240C46595140B71CF29877975DF141EAE7AAB',
  r: '0x40000405000941812906290517100AAC428A',
}, {
  a: '-0x8075499D1EA9FD0AB8F1484CFD7109C6C8BCD7E485959E54F39B9349776C8D0',
  b: '-0x1D717BF900D8DAEAE555FB53C2D3ABB9EDC9E2AD44B58310AD63D6795198352',
  r: '-0x9D757BFD1EF9FFEAFDF5FB5FFFF3ABFFEDFDF7EDC5B59F54FFFBD77977FCBE0',
}, {
  a: '0xB760E50189D03F31868A39EBCD0A260E0137A431F334A54C3E3C6',
  b: '0xD73D79D8D40B80303D9D548386176003C05ADA2A0A501854EC2EDFC825FBEA5E5BB4D',
  r: '0x3500440180102001800A182A08000004002684002130A04C1A344',
}, {
  a: '0xFC1AAFD49D578EEDAE166C599604938E532C61D4F5B889',
  b: '0x1FE4E85150D2F4E1C1CB8B315F2BE0686D7357',
  r: '0x1D448841001264418000830053286040653001',
}, {
  a: '-0x5EDA1C8F1E414EBD5E4443F988832191502A4CC04C035EB3CB1E071D2862FD01',
  b: '0xC46C10A6788A2CF215152692B19C83C402BCCE',
  r: '0x444C00A650822CB214010410A19882C40000CE',
}, {
  a: '0x3A3BCF1295C6B9872F44458D8EFB47F273947F03E30525A2F8',
  b: '0x14445F26C043C1EE9DC217D42B4A3D2665F0020C4EEC756034',
  r: '0x10004F02804281860D4005840A4A0522619002004204252030',
}, {
  a: '-0x7728A097F4E4F29F2F1A5697AD6CB08ED16DD96B8E45BA98',
  b: '-0x5803D399AB0DD0193C22F17B54AD87D7B1A21F810C0B598',
  r: '-0x77A8BDBFFEF4FF9FBFDA7F97BD6EF8FFFB7FF9FB9EC5BF98',
}, {
  a: '0x920774CB7371CF7D6094DBAF30262CC826E5D',
  b: '0x903CD22D09368193E9320788ACDEEC50E12DF1349D2AD374FCFE807D21F5',
  r: '0x820564C10210CF11409089270006280002055',
}, {
  a: '0xA6C695EB62661521576F3A52F4D1FBFE12BCE78B9D7C5A06E1A64B895124',
  b: '0x9A1EEE4FB8165436D0815D92146F3721542953279FACB',
  r: '0x1016E20528041436C0014C10104705204408402095000',
}, {
  a: '-0x5F2555E1718AFDF9AB4817A78F59BB7EE2A045B100D',
  b: '0x649ED6C888C29E5FB10F5A6C0563C8EF088D9',
  r: '0x48E54000040964810000244010148AA088D1',
}, {
  a: '-0xF895260B96472270F02F09748A093672E53',
  b: '-0x24537443F74FB5F1F194E8C8FE454B179BA84E1DAE4ACF3',
  r: '-0x24537443F74FFDF5F79FFECFFE75FB3F9BFCCE1DBE7AEF3',
}, {
  a: '0xD7762F90DEC3A59C518C4E36F7CDBF4F6231A7DE5109414',
  b: '-0x3F5AF459D05C3724506A86F2F366782D770E57',
  r: '0xD7762F90DC02009840880C04B2C917004001805C0009000',
}, {
  a: '0xD4D334AEDFADDD7ACDE759C614779A25C289E069D7EA3911475862775730C17566',
  b: '0x2A4DF4225C9B7C2E106F19374AABDBEC55283E8959851',
  r: '0x84144200018280E000D1823000051840520320811040',
}, {
  a: '-0x9552AEE5CF59A25F14F026A4F7322B71E33620059E9532450B',
  b: '0x4B2E9B784B510488BEF210D3DE9E7D468210BC749',
  r: '0xA249A08005104808CD000C1CC9C7D06020098241',
}, {
  a: '-0x88DF55DB2ACB321276376767BAFA17269AE7B96F5',
  b: '0xDDA2E5DB06ECB3B13D7D0B3FF01BFB7F90DA3AE98B8455A20D0F21E',
  r: '0xDDA2E5DB06ECB331202800153009E9098098184101805120080600A',
}, {
  a: '-0x100DAB76675D9BA76895F042F2F891F944361',
  b: '-0xC619C8CD2882A1550DA5177A4377FFE093F3B9FBBB3AA342E8ADF29ACBD729A9CD21',
  r: '-0xC619C8CD2882A1550DA5177A4377FFE193FBBFFFFFFBBB76E9FFF6BFEFDF3FBDCF61',
}, {
  a: '0x158317DD30A5AF89433EC5C5C59F960641BC3F3C81',
  b: '0x4AF9261F8F99B5553FDC86ECB5736CCD36E78DA05A3B575C71B',
  r: '0x1183155130802E894336C4C14418920401B4350401',
}, {
  a: '0xABB2C2270BA64C7F0CC8F6B53268CA4D6C9884134D9393FF49D095F',
  b: '0xE34D385BFD43F0B3F04829E32BE564B0A7D9BAC6B6138481CF7110B1285E',
  r: '0x81B2C0270B2604020C00B614020848092C08001048109311091085E',
}, {
  a: '-0xAB12ACC43C638F2B733E1A9A49AEDE9D57DE277DB0B1C49F99',
  b: '-0x1C041EAB58E9877BFDB7C11B6787BFDCC897CAA95E94C9ED44607627EE97BB7552C7',
  r: '-0x1C041EAB58E9877BFDBFD3BFE7BFFFDFEBF7FEBBDEDDEFFFDD77FE27FFB7BBF5DFDF',
}, {
  a: '0x7E4FF437FEEDB71C65905170C599EAE5947E769',
  b: '0xB99516E211F6FB2A28DC92582E81DE27E1321291D1A65F',
  r: '0x200F6432A28D81040080116044112021141A649',
}, {
  a: '-0xA1B70F3650D9CF4CE6B324BAC7D49D72B987459A49EE7ED5FACD17CD5FA',
  b: '-0x5251C0902B9166036555DF80E94A8472BE81DA01D94109C8',
  r: '-0xA1B70F3650DDEF5CEFB3BDBEE7F6DD7FF98FD5BA4FEFFEDDFADD97DDE00',
}, {
  a: '0x14DBEF9B30372DA00B26697F420C0FCC1B1FA8C9616E388',
  b: '0x9E52D46B74C5C094C6EF6A67333617ED097E0E70E3A6C30F60004E3696A27E7DBD9',
  r: '0x432312102509200A206126420C00000A168080606C388',
}, {
  a: '-0x12A43F03D0578947A0EBB2DE63762C62D00AB6F161C196467E7E8438',
  b: '0xE9F3431492AE8B9C6FE04D2694B36803307ACEB54E8D120B7E14880A1651979A0D1A',
  r: '0xE9F3431492AE891840E00D2014B0480000208C81428D02014804880A001181800908',
}, {
  a: '-0x5CE2A31E946BFA5EF2343385867E6D0C78D7AAADF14BCF',
  b: '-0xF0DA017A2848010B32462C774C6CC31943619C2DB7DD33AF87745A5EC4962',
  r: '-0xF0DA017A2848010FFE6E3DFF4EFFE7FF6363BC7DF7FFF3EF8F7EFADFD4BF0',
}, {
  a: '0x30DED4CAD3A34EFFFABB9E8672A4DAD53108104E5C3A544A14796EBD7',
  b: '-0x3ABE4E65BECB14CF5C25E98322966D9CD8217328216162C90D',
  r: '0x30DED4C8500308A4120A920230A042C5100800025C2844480069422D3',
}, {
  a: '-0xF147E62D5FCA32FBBB5F23019C9415E2F4E702D1DF4B72B2AB19EFCB6766B8',
  b: '0xABE3D8AC2A1B95BE6C7BE31F3C20DCF4801A41A9B3E9B1C95460E4F7CA4EDB0DA',
  r: '0xABE0C880080A011C4040420D0C2014B48010018992E0014854404461024889048',
}, {
  a: '0x170695468AE1DD92678B40A21D5C5E43469A2D19184B',
  b: '0xAFCDA464CA5B65A93E0856F8AF69CE4CDF1B3F1071ED0D43D5B114935120D8C8C4',
  r: '0x1006014608C119120001400001541000021020180840',
}, {
  a: '0x665D7BB09A4D5F8FDEF1A4891C1C8CFFA5A695E379DC358A969D1FA14E',
  b: '0x16C4035F29A4D6B7163A13D8433CDBD14CD948C4119ADE',
  r: '0x1684025120801414043A0180012059D00488008411804E',
}, {
  a: '-0xD55C4D03258B83E222402F2EB66ECB7B6F4A3AAD14E7FD1CB073ACDF77DC0A89',
  b: '0xEBA2D45D4F901C19E7F2CA77C835FAF0EB0ED07859F538DC373953AB70C114',
  r: '0xA3A2D45844101C19A7D0C04180348090A10450681800204C0411008820C114',
}, {
  a: '0x8575639C9E8F81D6059F0CF1993F59EA8B6C20D2667CB1128BB303343C4CAD',
  b: '0x818805B220920E62B998A1A3F3E1C46201868601788367A05D4788E',
  r: '0x81880010201000421990A182A0A0C0000006820128832020414488C',
}, {
  a: '0xDFD93961D597E2E75AB4AC720B08477B266F143756BDD44D75280A3',
  b: '-0x44717AC7A7CF63066DA9F6582CED7AE76220CB10CF12058',
  r: '0xDFD939619186802058308C700200012302020410149D144D30280A0',
}, {
  a: '0xA7F4FDAFF6F293483FD87D6DE87B624FE1DD8C892E59EF9E84B0319B20FF7B5BED',
  b: '0x6540AB11DDF697FB3829963FCD3DE6168DA3EEF2A2AC109BF13097F2391E72',
  r: '0x6500A210914017D83829803B400DE0148C812E50A28C0090311000F2391A60',
}, {
  a: '0xB3A15A4BA23B5C7A3A7A2BE2E1478F75BC5E3BD0',
  b: '0xAE98D2AA6ACC97BBC5FC0D9E4EBCE8F3B64FB95D86E5570255E0CED4BB4F19335',
  r: '0xA3800A0B203B14582A50202040048D41B4501310',
}, {
  a: '-0x757BDEEC3F6C166E89471B673B81AB213CB79376',
  b: '-0x9418E46DD19EDFF327FBCD4220714F4D4303DB9110F',
  r: '-0x941FF7FDFFDFFFF367FBDD73B673FF5FF313DBF9380',
}, {
  a: '-0x465041970BE5A19169607ECE347928F838B046',
  b: '-0x1552BEE25DF149E1E7386A1D974815BF4F1',
  r: '-0x465155BFEFE5FF95FF7E7FCEB5F97CF97BF4F6',
}, {
  a: '-0xEC707D8CF6338F70543C804988B5CEDE0466DA19D90724DD5AACFFAF37F649CEC9',
  b: '0x71CAAEEA380B30BD5CEB1CE330C3A69A115C8C65FE619B14',
  r: '0x414AA662080120B91821042230C322801100004008201114',
}, {
  a: '-0x6A657DD7FE2C42EFBAB67FED0144EC33C1EB2FC6025E35',
  b: '0x51FE477DF8D4220536116C7ED2830CD2D4CAA17BCAE71119FA13060AD1CE7F277D',
  r: '0x51FE477DF8D422053611041A820000D2940001498002101912000600D0087D2149',
}, {
  a: '0xCBD059A7CDCF5899A3FC2EA56C172947FEDD921966C5099CCA6F19263BAB3BC',
  b: '-0x164437C576BF91B4D6F43B086C4E4294A97E01ECF6917FC8D3E090DE78',
  r: '0xCBD058838C83089002E422802C0729031AD4900806C10094C803100032A2188',
}, {
  a: '-0xD9BE938BF7F760465693A7BAA8E5E8A30546A1B211ECC4A254E9F',
  b: '-0x83B2D06A08FCE29F395CFE09C5B6C3A768B5962C4AED73CCFA501E511C2970D1A47715',
  r: '-0x83B2D06A08FCE29F3DDFFF39FFFFF7A76DFDBE7FEAEF7FCEFA547E5B3D3FFCDBA57F9F',
}, {
  a: '-0x162877088FC44A93233D8B56B9300F0707E5048EF9DA999B8BD67886',
  b: '0x85B131698D196EA4191977BD7BB086A59D07B896C5F4FBA2A41',
  r: '0x8531012904094C24081064BD0B8080A59500201644444280240',
}, {
  a: '-0x6703EBA1C3C7CF49B21284548E590C99B5F0C356DA0554E92',
  b: '-0x19A7100D1938D41BFC3A6B857C7056121ADDA43DE',
  r: '-0x6703EBA1DBE7DF4DBB3AD45FFE7B6F9DFDF0D756DADDF4FDE',
}, {
  a: '-0xFC610E0DFB526B6CC4CBAA355B726C55510D4',
  b: '0x9365B5C576173E1B1A3E78AAD316F3831F445E23E57449AC8ADE1',
  r: '0x9365B5C576173E1B021E70A2000490831B045402A40401A88AD20',
}, {
  a: '0x832A8164F69CD430A3EB3565CE7A7A254D9559A0F67',
  b: '0x348D24C7E4ED302B6DA9D80AF4F178D1CD55E02A2AF275CE910E',
  r: '0x2020024D29C802003030504C45A02200D0558A0106',
}, {
  a: '0xCB65A452E7B1721AB322EAF259476273B93D1721D65D29594F25896B6457',
  b: '-0x980E6258FE4A6D03A64C44EF145942F578CEB',
  r: '0xCB65A452E7B1721AB322EAF25901427019190701921921080A2180286015',
}, {
  a: '-0xCBC0F273D520211AB409D00F60499C652228B0953099B66',
  b: '-0x3568461118D7E194DDFB66069F771AE2E79B8D8622C3350BB73E7EC',
  r: '-0x35684611DBD7F3F7DDFB671EBF7FDAEFE7DB9DE722EBB59FB7BFFF0',
}, {
  a: '-0x7FDE9BF9EA83483DDBB143B6FEE8A8254834619AA6E4FD8A63782291B07F61',
  b: '-0x3561E27CFE7553FCDE1A8006BBC4DC3DE873E758711BE5CCFA79B69430A324A40AE89B',
  r: '-0x3561E27CFFFFDBFDFE9BC83FFBF5DFBFFEFBEF7D793FE5DEFEFDFF9E73FB26B5BAFFFB',
}, {
  a: '0xF5B5EB5C438AACC171FE64C793715C4B7EEF6B782BA786D8E5BAEB7C963ED',
  b: '-0x97E4E67683217754103F0AAAF7FDC68CBE2328',
  r: '0xF5B5EB5C438AACC171FE64C6813118034CE80A382807045080228334140C8',
}, {
  a: '-0xD4ABE08E3C4740CE6A561DDA9F7AF24B1B2D5CE8E0EFB71C0F17',
  b: '-0xC077847E41C75842C1FBB8E2233257E38E7306C86D1100967600EC',
  r: '-0xC0F7AFFECFFF5F42CFFBFEFFFBBF7FF3CF7B2FDCEDF1EFB77E1000',
}, {
  a: '-0xCF1FD0A98D11AE51F828DDD0D83A59E0E6DF4E20A84669E0D7C42F92C55786B0A85F6',
  b: '-0x4D240614BE0671C3F0EAD926BDC9C310662BE35F1503AA77B9F18DA6EC5142A6F69',
  r: '-0xCF5FF4AF9DBFAE71FBF8FFD9FEBFD9E3F6FF6FE3FF576BEAF7FDFF9FE7FFD7F2AEFFE',
}, {
  a: '-0x9F2A5BF021AF8B6B0A1EBA58DBC39F36330772C2142E019E0FE',
  b: '0x49744A073255229ED26BBABEB17B27E1198FE4595311CCD6DA',
  r: '0x95040052005000E52001A32014204800988C0581111C41602',
}, {
  a: '0xB5DE7A0ED22B903D7E2DD5C905996452F299',
  b: '0x562FFE4F953ABA7CCFD8AA1DC2AE581D809B6A4E8FB6DF284BBB52774E3B1C1D',
  r: '0x101C000A420A80345E284189001144121019',
}, {
  a: '0xEC0813D962895582E2C2B521518B99A815F7899828B5A12E1471EFA5D769D7BCC3D88',
  b: '-0x202209F72757F269EB273A6CBFB539648349769DE63422C3',
  r: '0xEC0813D962895582E2C2B5215100898800D10108081120040461A7814000019C81D08',
}, {
  a: '-0x74D1C0E1641F29477F6217E09699030FC7AFC2698AA3A7EB8760B1A6C64CB69A2630',
  b: '0x705FFC81170ACD60AE11CA5277186022341E1AD62DA4E35B600B544E9A1DA990FB',
  r: '0x201F1C81000288008C000A4066186020101C12540C000058000A500892092190D0',
}, {
  a: '0xBD7C0B14CDDA5112A2305D136071BC8FC20B15099D3879796A6BD57A58F8',
  b: '0x937FB308D14B4ABD735F16DC4A4EBFD52BBC024EADA0DBF',
  r: '0x112A2300D1020219405C0090400893850394020C05A08B8',
}, {
  a: '-0x630AEA2B53C3690384BE98AAAA7C602C95D444FBC5',
  b: '0x9603A138F2360BBFD26248D330AA41C711CC',
  r: '0x94002010F032012750400093102A01830008',
}, {
  a: '0xCD41B6E613B487B299FB4687C78A91F5BE6ED7E7A',
  b: '-0x774596805BAEFCFDA14067C51FC1B5D561744E9',
  r: '0xCD00B26013A40102005A0680028010402A0E83A12',
}, {
  a: '0xA659BB61F81F70E7FA94CBE1C5738DA55898B2C9',
  b: '0xFB0B8A9F8928A6FB608147FDA55025265A64BE4AB5367214B52B834C',
  r: '0x20010361A01020265A048A408532000410088248',
}, {
  a: '0x16BFBA0F49FC007E7E52009256FE7358388C62E8EDC1F28BEB0B1',
  b: '0x4EC1C8D8D76D7CB9253A776D6031F22F0991B',
  r: '0x4E400090566C7018200862686001F20B09011',
}, {
  a: '-0x6F0F58BDD877138F0789305808009BE8E5DF5CF0801BEF22BDB2B61D52D18C213E',
  b: '0x2925B6A73672CBCA4CF9E28782EB076734A909AD68627757A7DD0D',
  r: '0x2820B0260622C3CA44110200820B07641089000D4862250623DC00',
}, {
  a: '0x7F65400AF2360215B9A67ED257B8F0F87F24B0B3D6793AD5752F2244F46790',
  b: '-0xA8D5CC50CB76A65132E5EEC3E2AC53563097DC1246DDCE9CD4F',
  r: '0x7F65400AF234020138A2489012A8D0A013009032C2183280340B0200142290',
}, {
  a: '-0x437C8D35830E77159B738D8977B1B014A0B8E4BC0832FF3D5D36499A956D7BBF762D3C',
  b: '0x5B6281B8D24F868C2589B05CE892F8FE03607AB8C4D27AB13DB78305639A11C15',
  r: '0x82281188206008425088044E890F070002078900402289124168100400811004',
}, {
  a: '-0xB3E4D32EA487D26D8E133129AA65B06025B1AF',
  b: '-0x99813FCA90B6C1C35F528D16A24EFA7B46CE846626A3C38D8181C1A790AEFCA',
  r: '-0x99813FCA90B6C1C35F528D16AB7EFF7BEECEFD66FEE3F39F9BA7DBA792FFFF0',
}, {
  a: '-0xEC67CF7FC43A13A3C143A089F82FFE7AFD2396350BE6028C8E4CCC257014F6',
  b: '0xE426DEFC59E80E656452DA7973008B4280D69928802360',
  r: '0x24245E7401C00005005048487000894200921108802300',
}, {
  a: '-0x977D89E6C698F73D36347FABA7029FFEA03F0D57079A024194F31FAC2385396C0E0A0',
  b: '-0x8E3862714626B32FDEC63242788332EF7BF058425534',
  r: '-0x977D89E6C698F73D36347FABAFE39FFFB47F6F77FFFE6365B7FB3FAEF7BF3DEC2F5C0',
}, {
  a: '-0x786A6F2592DF4C4A512A22116DC16965574',
  b: '-0x879509912175D54EE7DAF2ED0BEF2E77BC336E737A59F1C64A80CB0',
  r: '-0x879509912175D54EE7DAFAEF6FEFBEFFFC7B7F7B7A59FDC76BE5E00',
}, {
  a: '0x1508D9F2EB12F32DF838C78BF981AE1C36093A832',
  b: '-0x3CB8C6091A9B0387929B065106DD0C7EF84AF14D16ECBDC8055E',
  r: '0x50080D24B12E3002838000B50812E1034013A822',
}, {
  a: '-0xD6432D543DB6ED7BBE16E5857B5B1403930961ADCCF6029B0C0E7F1DDCDBAA660A34',
  b: '-0x7B2DE851AD68935097BEF18DCE3B3C44EDD6A',
  r: '-0xD6432D543DB6ED7BBE16E5857B5B1407B3DFE5BFDEFF379B7FEF7FDDFFFBEE6EDF7C',
}, {
  a: '0x6402B870A4B29D97E71EB4B9E40FD787EE291BB35131FFAA8C3C699D13F1A6A09BB',
  b: '0x3AA94854101BD7094E815D822180C9B112D4F82EAC835939AF47761D1678053917DEE',
  r: '0x2000101000920906811C802180099102C4280AA0011139AA04340914100120009AA',
}, {
  a: '0xF9620F7A8792BCF44876CA8503AC33F9B20777221ABE8',
  b: '0xF26C98B1FC3B3B3653627660A6C035EB9A43E773C4E49BD139',
  r: '0x89020332830034244002480102A820383204460018128',
}, {
  a: '-0x11A7E74ABC7A5571B95C0C30AA4E85C2B9C1BBF',
  b: '-0xEBDCF5551955FFC6CA14C08D2E0815ECE1970E5DE3A',
  r: '-0xEBDCF5F7FF5FFFFEDF75F9DD2E38BFEEE5D7BFDDFC0',
}, {
  a: '0x8F676C361390206A67EA83D52274D738174F',
  b: '0x49F66241CD54A1ED96C2E184750BBAD6E6E6E31E39E5D2430',
  r: '0xE416C261000002A256A0244206096180400',
}, {
  a: '-0x6988CE0DD0581686A77C891B663B2DE0E2BAAF40FD625D5D',
  b: '0x4A2F62BF3F77CE86771972418892725B5CD85518476F4E42BE7C',
  r: '0x4A2F023731720E86611950010080104050181500402F0200A220',
}, {
  a: '-0x72632C966E95D53F29BF666BDE14C35ED657BDF1CA1CE0BA72CB41',
  b: '0xD41EDC6826273A20CC979D47450865BCE17B9D5054B61D871',
  r: '0x141814202405200088021C034000008420631C10541011031',
}, {
  a: '0x5525AE1BED2514AF9375FA49267A136C398C0F8',
  b: '0x2A1923D32A4735B65A292B268CE54104B6B48F60B7DD99',
  r: '0x1024221B652010A200445000026A0064090C098',
}, {
  a: '0xAC9D30B3524CC9E56523515E341845B2E0B7D1568A523949',
  b: '-0xF7BBE3292999DF24B4C08DEB737C4FA2A1B462098B5BEEC9',
  r: '0x8041092524400C141235014040000104003915600001101',
}, {
  a: '-0xFDCAFDE851882DDD395915779D2FDCE01CE586F3AD9B',
  b: '0xA54A0A05003B653FD27C908E9AC6E976A2E6F4139CDE198B3E',
  r: '0xA54A0A000002052E5250008682C28862802214031858080224',
}, {
  a: '-0x46A0F85BFB5EA95506D219C61AAF95AF959DF58A8243409',
  b: '0x1CA25745802988E021EEFCC277A8E296211D143144DBB9A87DA41A3C7',
  r: '0x1CA25745802908002004A04222A8208621051020404A20087524183C7',
}, {
  a: '-0x2CF1E910B3067CA4AF3455B37ABF0877BFF165A83CA207732',
  b: '-0xD78BA64E5B349CB10CC8B0A7475F473DF42C6587BFE61EB1DB',
  r: '-0xD7CFBEDF5B34FFFB4EFBF5FF77FFF7BFFFFF77DFBFEE3EF7FC',
}, {
  a: '-0x50474522D840CD00D4BF55F0D21CBF2A4303C5FE',
  b: '0x8C007AEBEDECEC5D0FBCC771E4B1FB4B6DCE6EF9DA4A66E17B2',
  r: '0x8C007AEBEDE8E8090D90437124B0B00A20C24E30084A46C1202',
}, {
  a: '-0x5225BA6575858A81AC3AFF33AA5CE3EEFCFDF7529BCA424AB175821927397459DEE1B',
  b: '-0x3A8E19A964DBA0C034FC3CBF59B9CE2DED62A0E273F776DA880',
  r: '-0x5225BA6575858A81AC3AFF3BAB7CFBEEFCFDFF7EBFDBFBCEBDFDE2B9E77BF77FDEE80',
}, {
  a: '-0x34E106A86F2EA93D17200F8D9867BEEB4D1B3F23A85720BEA0',
  b: '0x97C94AC0A34EAD715186C637712B23DB674296718843E2F746784378',
  r: '0x97C94AC0024805105106C22051202243004014308040C05700584160',
}, {
  a: '-0xA3D6560E1FB004A94B050B705546D1547343',
  b: '-0xB9105ED25A196F8DD1084202A8F4E500F9D00E85D05F9CF',
  r: '-0xB9105ED25A1B7FEDF1E9FB02EAF4F550FFD55EEDD55FBCF',
}, {
  a: '0xF057123D5CB88E4C070A3958D193EA49BC7AF55E77A37E89',
  b: '-0xB0921AB8FFB3F186DAB903A8E3C7D00337AF340811ADD203',
  r: '0x4045000500080E480502385010102A488850C15666022C89',
}, {
  a: '0x963A08020412E6C2D4349A7CB37AD8601222A97EC6ED7BA32B7607831DDB1BF5B7DBD',
  b: '-0xF5088CB8509E0A141052DEBDCDF705BB5B088C46B93850F8B596CBA7085',
  r: '0x963A08020402E64244240074A36A88200222087A44A4732329460783054A093410D39',
}, {
  a: '-0x3986EDB2382E93D1D84D05DDA85648DBA53736DF573D21BE63EE811',
  b: '-0x72812766A4562C848234D0CF4C185D6F2AB371F3A',
  r: '-0x3986EDB2382E93F3D96F67FDFE7ECCDBB5F7FFDF5F7D6FBEF3FFF3A',
}, {
  a: '0xC4D8A47CB2A1B362B45C0AAD6CA12CF3D8CAE12E1F95D6CB4C84AAEAC3C9F2',
  b: '0x28D18DA33F9D4E421140E5F41C7A9CD667810711DDC5A1EA1D28',
  r: '0x209100A01C080C400100E1D008600C16058003008480A0C20920',
}, {
  a: '-0x862AAD05944E5CE6D1352B12FC3EE5D7E826AD8F3F8217217B5551AE92F11B',
  b: '0xBBBD85B866D8E7AD9C3FBC4E5B9B4B598743C4B27BFA',
  r: '0x8A948500401820059812304059884A00820240200AE0',
}, {
  a: '-0x8281BE2C0B298021D894085D1342D2AED3F2E48D4',
  b: '-0x92D636DCBBAA3A6C232028B897DC72AC339C11CAB8FEE3395E5A613D9A86C01403FBB',
  r: '-0x92D636DCBBAA3A6C232028B897DCF2ADBFBC1BEBB8FFFBBD5E5F737FDAAED3F6E7FFC',
}, {
  a: '-0x233806221E6BDC20A3D2B16346D8ADEFA61B',
  b: '-0xF2B0C04C2E57F7AC8E1CA0E854A27F68211A09836B4B8298365CC4C6E',
  r: '-0xF2B0C04C2E57F7AC8E1CA2FBD4E27FEEBDDA0BBF6B5FB6FDBEDEFEE80',
}, {
  a: '0xE16AEECEE840EFCE0A540C261845377DB91B3',
  b: '0xAE0E5F62B14F35A77D6A121B36655C2AF43264',
  r: '0xE060E60A00404A46020000220045022D01020',
}, {
  a: '0xEFB8EC155E55478FFF77A3D15F4E5C5E8E3F1593A66DBA0C695926A3CB55B90CAF6A4B',
  b: '-0x1953B496517C4702E8637DD6A410F0C870239AD07C355AB9A4',
  r: '0xEFB8EC155E55478FFF77A2804B480C02883D159082291A0C0911068041058108A54248',
}, {
  a: '-0x2364E865DAB6297DEC3C5D344D2A6D72F81F778EDF7F7586F6668CC26733DE',
  b: '0x9618BECBD3B18FF164639A07697BF879E9C17A0230A',
  r: '0x1208BA0951208070000312000823901981015800002',
}, {
  a: '0xEDAE7D15862FA818DFFE3F16D69A4020E06F5A5D2C626CA55C7A5CFA',
  b: '0xA676B9E1A94336BD1AB6B6252B0B8E3E9C90EDA7A3ADCF9C',
  r: '0x8626A8008942361412920020200B0A1C0C006CA500284C98',
}, {
  a: '0xA58F06E0B8F1A7CFC9036060C864BE3B420',
  b: '0x59C2A4F7964B2670F16003A1D8B9079341E01982A2A708',
  r: '0xA00706000030058B8001200000002A2A400',
}];

const dataSmall = [{
  a: '0xDD6CBA10C5',
  b: '-0xA88BD',
  r: '0xDD6CB01041',
}, {
  a: '-0x2',
  b: '-0x6D4',
  r: '-0x6D4',
}, {
  a: '-0x97B',
  b: '0x7171ABE3',
  r: '0x7171A281',
}, {
  a: '-0x90CBB4761A9E',
  b: '-0xBD84',
  r: '-0x90CBB476BFA0',
}, {
  a: '0xC7',
  b: '-0x31FE82B89331C2',
  r: '0x6',
}, {
  a: '-0x20BC95E6405A9',
  b: '-0x5871A97874BCDA4',
  r: '-0x5871BDFDF6FCDAC',
}, {
  a: '-0xAB40',
  b: '-0x8',
  r: '-0xAB40',
}, {
  a: '0xB32E4843ED636',
  b: '-0xC92AEC62D7469CC',
  r: '0x91020800A9634',
}, {
  a: '0xED147C393',
  b: '-0x67D5',
  r: '0xED1478003',
}, {
  a: '0x937E28DAD81',
  b: '-0x77FA11B6F',
  r: '0x930800CA481',
}, {
  a: '0xD89E17ACE12968',
  b: '0x4AE04D',
  r: '0x402048',
}, {
  a: '0xA3',
  b: '-0x5083E34',
  r: '0x80',
}, {
  a: '-0x1',
  b: '0xB79994753BA1C9A',
  r: '0xB79994753BA1C9A',
}, {
  a: '-0x5AD64',
  b: '-0xB3D4C2',
  r: '-0xB7FDE4',
}, {
  a: '-0x78B25F9492535E9',
  b: '0xDEE5B78D5AAD',
  r: '0xDA04B6884A05',
}, {
  a: '0xE0EA8',
  b: '0x1EF84CA',
  r: '0xE0488',
}, {
  a: '-0x659CA0E4EAAF',
  b: '0x66',
  r: '0x40',
}, {
  a: '0xE44',
  b: '0x0',
  r: '0x0',
}, {
  a: '0x233A08CC8F',
  b: '0x36FBD25E8D04B942',
  r: '0x208008802',
}, {
  a: '-0x755855',
  b: '0xC',
  r: '0x8',
}, {
  a: '-0x34F9',
  b: '0x0',
  r: '0x0',
}, {
  a: '-0x8597588',
  b: '0xFA9159EA7B3',
  r: '0xFA915868230',
}, {
  a: '0xDF5FBCE6',
  b: '0xCB24A1B71199',
  r: '0x81171080',
}, {
  a: '0x0',
  b: '0x259EF9C',
  r: '0x0',
}, {
  a: '-0x912',
  b: '0x5B2',
  r: '0x4A2',
}, {
  a: '0xCBC86',
  b: '0xFF78',
  r: '0xBC00',
}, {
  a: '0x581DE4C03B9A06',
  b: '0xE5DE23BAA87',
  r: '0xC44C03B8A06',
}, {
  a: '0xD3CA',
  b: '-0xD',
  r: '0xD3C2',
}, {
  a: '0xAF',
  b: '-0x5C51',
  r: '0xAF',
}, {
  a: '0x154626F099180',
  b: '0xD7BED62A233',
  r: '0x4626D008000',
}, {
  a: '0x434F34808',
  b: '-0x954FFB4BDD5CD6E2',
  r: '0x420A30808',
}, {
  a: '-0x25443547B',
  b: '0x518C1A4B4',
  r: '0x50880A084',
}, {
  a: '0xFF4A0D25E6',
  b: '0x62DB6A0C1E899A',
  r: '0x6A080C0182',
}, {
  a: '-0xC7D61540',
  b: '-0x45ED4F5E',
  r: '-0xC7FF5F80',
}, {
  a: '0x9A007DAF',
  b: '-0xD08D',
  r: '0x9A002D23',
}, {
  a: '-0x10502',
  b: '0x5FF6AFB6',
  r: '0x5FF6AAB6',
}, {
  a: '0xE50ED940',
  b: '-0xDC7A6BA8979293B',
  r: '0x6406D040',
}, {
  a: '0x0',
  b: '0x146',
  r: '0x0',
}, {
  a: '0xB0',
  b: '0x0',
  r: '0x0',
}, {
  a: '-0x8CC9A1562E',
  b: '-0xA4D53534C8A',
  r: '-0xACDDBF35EAE',
}, {
  a: '0xB3',
  b: '0xE1682BA',
  r: '0xB2',
}, {
  a: '0x82788FF4AAAA',
  b: '-0xAB3B811D',
  r: '0x827804C42AA2',
}, {
  a: '-0xCBDB',
  b: '0xAD425491C6BDCD89',
  r: '0xAD425491C6BD0401',
}, {
  a: '-0x53D6B4C',
  b: '-0x2CC',
  r: '-0x53D6BCC',
}, {
  a: '-0xB72E030C73D',
  b: '0xD7E',
  r: '0x842',
}, {
  a: '-0x97833C40',
  b: '0x8C8E59',
  r: '0xC8240',
}, {
  a: '-0x6A637FD6828',
  b: '-0x3E',
  r: '-0x6A637FD6840',
}, {
  a: '-0x49B5C3',
  b: '0x3DF',
  r: '0x21D',
}, {
  a: '0xB07E4D108DE',
  b: '0xA7F93C6EE92',
  r: '0xA0780C00892',
}, {
  a: '-0xC44380EDC',
  b: '0x3C4',
  r: '0x104',
}, {
  a: '0x3DE558070B1DE5',
  b: '0xE9E2A1DF828394A1',
  r: '0x20A158020314A1',
}, {
  a: '0xF64D8B4',
  b: '-0xE2B241',
  r: '0xF0448B4',
}, {
  a: '0x8A957A40192',
  b: '-0x7DB6',
  r: '0x8A957A40002',
}, {
  a: '0x0',
  b: '-0x3B3DD00BE5965437',
  r: '0x0',
}, {
  a: '0x0',
  b: '-0x9EA48C',
  r: '0x0',
}, {
  a: '0x7E2B',
  b: '0x1BD7',
  r: '0x1A03',
}, {
  a: '-0x618719DAE4AC',
  b: '0xA5C55F1D3B0',
  r: '0xA5844211310',
}, {
  a: '0x46B2FBDA0783E',
  b: '-0xEA3F2B46DEB',
  r: '0x4610C0D001014',
}, {
  a: '-0xD8EAC2461BC1',
  b: '0xF',
  r: '0xF',
}, {
  a: '0x0',
  b: '-0xD20128710F6BA8',
  r: '0x0',
}, {
  a: '-0x23EB4',
  b: '-0x85A994DDEF765E27',
  r: '-0x85A994DDEF767EB8',
}, {
  a: '0x84D262D8143D288',
  b: '0x765789C',
  r: '0x1415088',
}, {
  a: '-0xCE1',
  b: '-0x291E',
  r: '-0x2DFE',
}, {
  a: '0xCE3B8B0597',
  b: '-0x7E4E5BF102',
  r: '0x8031800496',
}, {
  a: '0x68656540717A5D74',
  b: '-0x902',
  r: '0x68656540717A5474',
}, {
  a: '-0x63739B5C754',
  b: '-0x45209097D1DDC2A4',
  r: '-0x452096B7F9FDC7F4',
}, {
  a: '0x46F99223A47E2',
  b: '-0xF22A4005B',
  r: '0x46F90001A47A0',
}, {
  a: '-0x7ED091F',
  b: '0xC4BCD8173',
  r: '0xC48008061',
}, {
  a: '0x69C92D1EF609',
  b: '0x5DFC',
  r: '0x5408',
}, {
  a: '-0xEA7F4E02DB00',
  b: '-0x783A8680596E7A1',
  r: '-0x783EA7F4F970000',
}, {
  a: '-0xDCF06C1684137A',
  b: '-0xB7E573B7',
  r: '-0xDCF06CB7E57400',
}, {
  a: '0xF6585D5B',
  b: '0x0',
  r: '0x0',
}, {
  a: '-0x51D192BA',
  b: '-0x32F',
  r: '-0x51D193C0',
}, {
  a: '-0x4F55',
  b: '0x56D',
  r: '0x29',
}, {
  a: '-0x45E8610',
  b: '-0x49C5F3E926ED',
  r: '-0x49C5F7FFA6F0',
}, {
  a: '0x35DDF0C2D7',
  b: '-0x2E146D',
  r: '0x35DDD0C293',
}, {
  a: '-0x973D2AE0EFFE',
  b: '0x631AE7EFF08',
  r: '0x841E1000',
}, {
  a: '0x59E3A7E9CFA9',
  b: '0x8025781E8F91',
  r: '0x2120088F81',
}, {
  a: '0x3',
  b: '0xB7E3CD7FBC417',
  r: '0x3',
}, {
  a: '-0xE1',
  b: '0xF9A363',
  r: '0xF9A303',
}, {
  a: '0x23',
  b: '-0x41EC',
  r: '0x0',
}, {
  a: '0x37A',
  b: '-0x91',
  r: '0x36A',
}, {
  a: '-0x81A',
  b: '-0x12CD4C8DE027',
  r: '-0x12CD4C8DE840',
}, {
  a: '0xAA2D27840E',
  b: '0x6E',
  r: '0xE',
}, {
  a: '-0xB097C',
  b: '0x1940D73F1E',
  r: '0x1940D43604',
}, {
  a: '0xAE439614708',
  b: '0x65FFFA8D3BA9',
  r: '0xE438010308',
}, {
  a: '-0xB48C28E1259AD',
  b: '0x65E9FD4AC0',
  r: '0x2561ED0240',
}, {
  a: '0xF',
  b: '-0x772',
  r: '0xE',
}, {
  a: '0xBA99757D8',
  b: '-0x18E0',
  r: '0xBA9974700',
}, {
  a: '-0xD3',
  b: '-0xDD20D0049BC9AE9',
  r: '-0xDD20D0049BC9AFB',
}, {
  a: '0xE209B743D8D',
  b: '-0xFA515272',
  r: '0xE2001242D8C',
}, {
  a: '0x0',
  b: '0x14',
  r: '0x0',
}, {
  a: '0xD9CF19070',
  b: '-0x28B00AC4CF',
  r: '0x50CF11030',
}, {
  a: '0xD6DF4BDF6A5F1',
  b: '0x0',
  r: '0x0',
}, {
  a: '0x80',
  b: '0x6D',
  r: '0x0',
}, {
  a: '0xEA0AB1166B',
  b: '0xDB762FC',
  r: '0x8B10268',
}, {
  a: '-0xA6E38A1394D3D158',
  b: '-0xB0FCC',
  r: '-0xA6E38A1394DBDFE0',
}, {
  a: '-0xC0BBA7F9',
  b: '-0x1D17',
  r: '-0xC0BBBFFF',
}, {
  a: '-0x1B76AF67304A5588',
  b: '-0x5E',
  r: '-0x1B76AF67304A55E0',
}, {
  a: '-0x10754975',
  b: '0x2AB290957A',
  r: '0x2AA280940A',
}];

import JSBI from '../dist/jsbi.mjs';
const JSBigInt = JSBI.BigInt;

let errorCount = 0;

const dataBigNative = [];
const dataBigJsbi = [];
const dataSmallNative = [];
const dataSmallJsbi = [];

function hexParseN(s) {
  if (s.charCodeAt(0) === 0x2D) return -BigInt(s.slice(1));
  return BigInt(s);
}
function parseNative(d) {
  if (d.b) {
    return {a: hexParseN(d.a), b: hexParseN(d.b), r: hexParseN(d.r)};
  }
  return {a: hexParseN(d.a), r: hexParseN(d.r)};
}
function hexParse(s) {
  if (s.charCodeAt(0) === 0x2D) {
    const result = JSBigInt(s.slice(1));
    result.sign = true;
    return result;
  }
  return JSBigInt(s);
}
function parseJSBI(d) {
  if (d.b) {
    return {a: hexParse(d.a), b: hexParse(d.b), r: hexParse(d.r)};
  }
  return {a: hexParse(d.a), r: hexParse(d.r)};
}
function prepareData(src, dstNative, dstJsbi) {
  for (let i = 0; i < src.length; i++) {
    const d = src[i];
    dstNative.push(parseNative(d));
    dstJsbi.push(parseJSBI(d));
  }
}
prepareData(dataBig, dataBigNative, dataBigJsbi);
prepareData(dataSmall, dataSmallNative, dataSmallJsbi);


function testNative(data, reps) {
  for (let i = 0; i < data.length; i++) {
    const d = data[i];
    const r = d.a & d.b;
    if (d.r !== r) {
      console.log('Input A:  ' + d.a.toString(16));
      console.log('Input B:  ' + d.b.toString(16));
      console.log('Result:   ' + r.toString(16));
      console.log('Expected: ' + d.r.toString(16));
      console.log('Op: &');
      errorCount++;
    }
  }
  let r;
  const t1 = Date.now();
  for (let j = 0; j < reps; j++) {
    for (let i = 0; i < data.length; i++) {
      const d = data[i];
      r = d.a & d.b;
    }
  }
  // Confuse the compiler into thinking that the loop is needed :-)
  const d = data[data.length - 1];
  if (d.r !== r) throw new Error('no dead code elimination please');
  return Date.now() - t1;
}


function testJsbi(data, reps) {
  for (let i = 0; i < data.length; i++) {
    const d = data[i];
    const r = JSBI.bitwiseAnd(d.a, d.b);
    if (!JSBI.equal(r, d.r)) {
      console.log('Input A:  ' + d.a.toString(16));
      console.log('Input B:  ' + d.b.toString(16));
      console.log('Result:   ' + r.toString(16));
      console.log('Expected: ' + d.r.toString(16));
      console.log('Op: bitwiseAnd');
      errorCount++;
    }
  }
  let r;
  const t1 = Date.now();
  for (let j = 0; j < reps; j++) {
    for (let i = 0; i < data.length; i++) {
      const d = data[i];
      r = JSBI.bitwiseAnd(d.a, d.b);
    }
  }
  // Confuse the compiler into thinking that the loop is needed :-)
  const d = data[data.length - 1];
  if (!JSBI.equal(r, d.r)) throw new Error('no dead code elimination please');
  return Date.now() - t1;
}


const kRepsBig = 40000;
const kRepsSmall = 120000;

console.log('Testing bitwiseAnd:');
console.log('Native/big:   ' + testNative(dataBigNative, kRepsBig));
console.log('JSBI/big:     ' + testJsbi(dataBigJsbi, kRepsBig));
console.log('Native/small: ' + testNative(dataSmallNative, kRepsSmall));
console.log('JSBI/small:   ' + testJsbi(dataSmallJsbi, kRepsSmall));

if (errorCount !== 0) {
  console.error('Finished with ' + errorCount + ' errors.');
  // Support both d8 (`quit`) and Node.js (`process.exit`).
  (typeof quit !== 'undefined' ? quit : process.exit)(1);
}
